package com.xy.iot.serial.port.listener;

import com.xy.iot.common.utils.CommonUtil;
import com.xy.iot.serial.port.utils.SerialPortUtil;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import lombok.extern.slf4j.Slf4j;

/**
 * @author: niuniu
 * @Date: 2024/6/11 19:22
 * @Description: 串口监听器
 */
@Slf4j
public class MySerialPortEventListener implements SerialPortEventListener,SerialPortHandler {

    private SerialPort serialPort;
    public MySerialPortEventListener(){

    }
    public MySerialPortEventListener(SerialPort serialPort) {
        this.serialPort = serialPort;
    }

    /**
     *         BI -通讯中断
     *     　　CD -载波检测
     *     　　CTS -清除发送
     *     　　DATA_AVAILABLE -有数据到达
     *     　　DSR -数据设备准备好
     *     　　FE -帧错误
     *     　　OE -溢位错误
     *     　　OUTPUT_BUFFER_EMPTY -输出缓冲区已清空
     *     　　PE -奇偶校验错
     *         RI -　振铃指示
     * @param serialPortEvent
     */
    @Override
    public void serialEvent(SerialPortEvent serialPortEvent) {
            switch (serialPortEvent.getEventType()){
                case SerialPortEvent.BI://通讯中断
                    log.info("通讯中断");
                    break;
                case SerialPortEvent.CD://载波检测
                    log.info("载波检测");
                    break;
                case SerialPortEvent.CTS://清除发送
                    log.info("清除发送");
                    break;
                case SerialPortEvent.DATA_AVAILABLE://有数据到达
                    log.info("有数据到达");
                    byte[] bytes = SerialPortUtil.readFromPort(this.serialPort);
                    handler(bytes);
                    break;
                case SerialPortEvent.DSR://数据设备准备好
                    log.info("数据设备准备好");
                    break;
                case SerialPortEvent.FE://帧错误
                    log.error("帧错误");
                    break;
                case SerialPortEvent.OE://溢位错误
                    log.error("溢位错误");
                    break;
                case SerialPortEvent.OUTPUT_BUFFER_EMPTY://输出缓冲区已清空
                    log.info("输出缓冲区已清空");
                    break;
                case SerialPortEvent.PE://奇偶校验错
                    log.error("奇偶校验错");
                    break;
                case SerialPortEvent.RI://振铃指示
                    log.info("振铃指示");
                    break;
                default:
                    throw new IllegalStateException("Unexpected value: " + serialPortEvent.getEventType());
            }
    }

    @Override
    public void handler(byte[] bytes) {
        log.info("接收到待处理指令byteToDecodeHexStr："+ CommonUtil.byteToDecodeHexStr(bytes));
    }
}
